package com.zxy.leetcode._00000_00099._00020_00029;

import com.zxy.leetcode.common.ListNode;
import com.zxy.leetcode.common.ListNodeHelper;

/**
 * https://leetcode-cn.com/problems/swap-nodes-in-pairs/
 *
 * 两两交换链表中的节点
 *
 * 给定一个链表，两两交换其中相邻的节点，并返回交换后的链表。
 * 你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
 */
public class Test00024 {

    public static void main(String[] args) {
        Test00024 test = new Test00024();

        for (int i=2; i<=10; i++) {
            ListNode head = ListNodeHelper.build(i);
            System.out.println("前");
            ListNodeHelper.print(head);
            head = test.swapPairs(head);
            System.out.println("后");
            ListNodeHelper.print(head);
            System.out.println("==========");
        }

    }

    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode pre = new ListNode(0, head);
        ListNode cursor = head;
        ListNode result = head.next;
        while (cursor != null && cursor.next != null) {
            ListNode node1 = cursor;
            ListNode node2 = node1.next;
            ListNode node3 = node2.next;

            node1.next = node3;
            node2.next = node1;
            pre.next = node2;

            cursor = node3;
            // 前面两两互换后，再下一次循环，需要跟前面的一组进行关联
            pre = node1;
        }

        return result;
    }

    /*
    官方采用递归的方式进行解决
     */
    public ListNode swapPairs2(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode newHead = head.next;
        head.next = swapPairs2(newHead.next);
        newHead.next = head;
        return newHead;
    }

}
